package com.adam.test.example;

import org.springframework.transaction.annotation.Propagation;

/**
 * 事务传播行为查询示例
 * 
 * @author jiangwh
 */
public interface PropagationSelectExample {

    /**
     * 清理表
     */
    void truncate();

    /**
     * 主方法未开启事务，查询结果不受影响
     * <ul>
     *     <li>主方法：不使用事务</li>
     *     <li>1. 使用{@link Propagation#REQUIRED}添加</li>
     *     <li>2. 使用{@link Propagation#REQUIRED}获取，可见</li>
     *     <li>3. 直接获取，可见</li>
     * </ul>
     * 
     * @return 按顺序返回结果数组（是否存在）
     */
    boolean[] no_addRequired_getRequired_get();
    
    /**
     * 获取方法与主方法同一事务，可以看到此事务内添加的数据
     * <ul>
     *     <li>主方法：使用{@link Propagation#REQUIRED}</li>
     *     <li>1. 使用{@link Propagation#REQUIRED}添加</li>
     *     <li>2. 使用{@link Propagation#REQUIRED}获取，可见</li>
     *     <li>3. 直接获取，可见</li>
     * </ul>
     * 
     * @return 按顺序返回结果数组（是否存在）
     */
    boolean[] required_addRequired_getRequired_get();
    
    /**
     * 获取方法为新事务，主方法事务尚未提交，无法看到此事务内添加的数据
     * <ul>
     *     <li>主方法：使用{@link Propagation#REQUIRED}</li>
     *     <li>1. 使用{@link Propagation#REQUIRED}添加</li>
     *     <li>2. 使用{@link Propagation#REQUIRES_NEW}获取，不可见</li>
     *     <li>3. 直接获取，可见</li>
     * </ul>
     * 
     * @return 按顺序返回结果数组（是否存在）
     */
    boolean[] required_addRequired_getNew_get();
    
    /**
     * 获取方法为嵌套事务，与主方法共用同一事务，可以看到此事务内添加的数据
     * <ul>
     *     <li>主方法：使用{@link Propagation#REQUIRED}</li>
     *     <li>1. 使用{@link Propagation#REQUIRED}添加</li>
     *     <li>2. 使用{@link Propagation#NESTED}获取，可见</li>
     *     <li>3. 直接获取，可见</li>
     * </ul>
     * 
     * @return 按顺序返回结果数组（是否存在）
     */
    boolean[] required_addRequired_getNested_get();
    
    /**
     * 获取方法为支持事务，与主方法共用同一事务，可以看到此事务内添加的数据
     * <ul>
     *     <li>主方法：使用{@link Propagation#REQUIRED}</li>
     *     <li>1. 使用{@link Propagation#REQUIRED}添加</li>
     *     <li>2. 使用{@link Propagation#SUPPORTS}获取，可见</li>
     *     <li>3. 直接获取，可见</li>
     * </ul>
     * 
     * @return 按顺序返回结果数组（是否存在）
     */
    boolean[] required_addRequired_getSupports_get();
    
}
